# -*- coding: utf-8 -*- 
# @project : 《Atcoder》
# @Author : created by bensonrachel on 2021/8/20
# @File : D - Leaping Tak（DP）.py



def dp_leak_tak():
    dp = [0] * (n + 1)
    pre_fix = [0] * (n + 1)
    dp[1] = 1
    pre_fix[1] = 1#前缀和数组
    for i in range(2, n + 1):
        for seg in char:#遍历K个
            x = max(0, i - seg[0])#这两句判断是否超出范围。
            y = max(0, i - seg[1] - 1)#segment的两端点都是包含的，所以这要i - seg[1] - 1。
            dp[i] += (pre_fix[x] - pre_fix[y]) % mod# 取模
        pre_fix[i] = (pre_fix[i - 1] + dp[i]) % mod#维护一个前缀和数组（pre_fix[i]包含当前dp[i]）
    return dp[-1]

"""
基础线性DP，利用前缀和优化时间复杂度才能AC。

对于每一个n，都可以S里的不超过范围的i-d的位置跳过来，所以方法是这些的叠加。
但是会超时，要利用K的比较小的这个特点，就需要用到前缀和数组来获取每一段的和，前提是两端点不超出范围。

"""

if __name__ == "__main__":
    n, k = map(int, input().split())
    char = []
    mod = 998244353
    for _ in range(k):
        a, b = map(int, input().split())
        char.append((a, b))
    res = dp_leak_tak()
    print(res % mod)
